home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / octa209s.zip / octave-2.09 / libcruft / lapack / ilaenv.f < prev    next >
Text File  |  1996-07-19  |  15KB  |  507 lines

  1.       INTEGER          FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3,
  2.      $                 N4 )
  3. *
  4. *  -- LAPACK auxiliary routine (version 2.0) --
  5. *     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
  6. *     Courant Institute, Argonne National Lab, and Rice University
  7. *     September 30, 1994
  8. *
  9. *     .. Scalar Arguments ..
  10.       CHARACTER*( * )    NAME, OPTS
  11.       INTEGER            ISPEC, N1, N2, N3, N4
  12. *     ..
  13. *
  14. *  Purpose
  15. *  =======
  16. *
  17. *  ILAENV is called from the LAPACK routines to choose problem-dependent
  18. *  parameters for the local environment.  See ISPEC for a description of
  19. *  the parameters.
  20. *
  21. *  This version provides a set of parameters which should give good,
  22. *  but not optimal, performance on many of the currently available
  23. *  computers.  Users are encouraged to modify this subroutine to set
  24. *  the tuning parameters for their particular machine using the option
  25. *  and problem size information in the arguments.
  26. *
  27. *  This routine will not function correctly if it is converted to all
  28. *  lower case.  Converting it to all upper case is allowed.
  29. *
  30. *  Arguments
  31. *  =========
  32. *
  33. *  ISPEC   (input) INTEGER
  34. *          Specifies the parameter to be returned as the value of
  35. *          ILAENV.
  36. *          = 1: the optimal blocksize; if this value is 1, an unblocked
  37. *               algorithm will give the best performance.
  38. *          = 2: the minimum block size for which the block routine
  39. *               should be used; if the usable block size is less than
  40. *               this value, an unblocked routine should be used.
  41. *          = 3: the crossover point (in a block routine, for N less
  42. *               than this value, an unblocked routine should be used)
  43. *          = 4: the number of shifts, used in the nonsymmetric
  44. *               eigenvalue routines
  45. *          = 5: the minimum column dimension for blocking to be used;
  46. *               rectangular blocks must have dimension at least k by m,
  47. *               where k is given by ILAENV(2,...) and m by ILAENV(5,...)
  48. *          = 6: the crossover point for the SVD (when reducing an m by n
  49. *               matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds
  50. *               this value, a QR factorization is used first to reduce
  51. *               the matrix to a triangular form.)
  52. *          = 7: the number of processors
  53. *          = 8: the crossover point for the multishift QR and QZ methods
  54. *               for nonsymmetric eigenvalue problems.
  55. *
  56. *  NAME    (input) CHARACTER*(*)
  57. *          The name of the calling subroutine, in either upper case or
  58. *          lower case.
  59. *
  60. *  OPTS    (input) CHARACTER*(*)
  61. *          The character options to the subroutine NAME, concatenated
  62. *          into a single character string.  For example, UPLO = 'U',
  63. *          TRANS = 'T', and DIAG = 'N' for a triangular routine would
  64. *          be specified as OPTS = 'UTN'.
  65. *
  66. *  N1      (input) INTEGER
  67. *  N2      (input) INTEGER
  68. *  N3      (input) INTEGER
  69. *  N4      (input) INTEGER
  70. *          Problem dimensions for the subroutine NAME; these may not all
  71. *          be required.
  72. *
  73. * (ILAENV) (output) INTEGER
  74. *          >= 0: the value of the parameter specified by ISPEC
  75. *          < 0:  if ILAENV = -k, the k-th argument had an illegal value.
  76. *
  77. *  Further Details
  78. *  ===============
  79. *
  80. *  The following conventions have been used when calling ILAENV from the
  81. *  LAPACK routines:
  82. *  1)  OPTS is a concatenation of all of the character options to
  83. *      subroutine NAME, in the same order that they appear in the
  84. *      argument list for NAME, even if they are not used in determining
  85. *      the value of the parameter specified by ISPEC.
  86. *  2)  The problem dimensions N1, N2, N3, N4 are specified in the order
  87. *      that they appear in the argument list for NAME.  N1 is used
  88. *      first, N2 second, and so on, and unused problem dimensions are
  89. *      passed a value of -1.
  90. *  3)  The parameter value returned by ILAENV is checked for validity in
  91. *      the calling subroutine.  For example, ILAENV is used to retrieve
  92. *      the optimal blocksize for STRTRI as follows:
  93. *
  94. *      NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
  95. *      IF( NB.LE.1 ) NB = MAX( 1, N )
  96. *
  97. *  =====================================================================
  98. *
  99. *     .. Local Scalars ..
  100.       LOGICAL            CNAME, SNAME
  101.       CHARACTER*1        C1
  102.       CHARACTER*2        C2, C4
  103.       CHARACTER*3        C3
  104.       CHARACTER*6        SUBNAM
  105.       INTEGER            I, IC, IZ, NB, NBMIN, NX
  106. *     ..
  107. *     .. Intrinsic Functions ..
  108.       INTRINSIC          CHAR, ICHAR, INT, MIN, REAL
  109. *     ..
  110. *     .. Executable Statements ..
  111. *
  112.       GO TO ( 100, 100, 100, 400, 500, 600, 700, 800 ) ISPEC
  113. *
  114. *     Invalid value for ISPEC
  115. *
  116.       ILAENV = -1
  117.       RETURN
  118. *
  119.   100 CONTINUE
  120. *
  121. *     Convert NAME to upper case if the first character is lower case.
  122. *
  123.       ILAENV = 1
  124.       SUBNAM = NAME
  125.       IC = ICHAR( SUBNAM( 1:1 ) )
  126.       IZ = ICHAR( 'Z' )
  127.       IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN
  128. *
  129. *        ASCII character set
  130. *
  131.          IF( IC.GE.97 .AND. IC.LE.122 ) THEN
  132.             SUBNAM( 1:1 ) = CHAR( IC-32 )
  133.             DO 10 I = 2, 6
  134.                IC = ICHAR( SUBNAM( I:I ) )
  135.                IF( IC.GE.97 .AND. IC.LE.122 )
  136.      $            SUBNAM( I:I ) = CHAR( IC-32 )
  137.    10       CONTINUE
  138.          END IF
  139. *
  140.       ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN
  141. *
  142. *        EBCDIC character set
  143. *
  144.          IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
  145.      $       ( IC.GE.145 .AND. IC.LE.153 ) .OR.
  146.      $       ( IC.GE.162 .AND. IC.LE.169 ) ) THEN
  147.             SUBNAM( 1:1 ) = CHAR( IC+64 )
  148.             DO 20 I = 2, 6
  149.                IC = ICHAR( SUBNAM( I:I ) )
  150.                IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.
  151.      $             ( IC.GE.145 .AND. IC.LE.153 ) .OR.
  152.      $             ( IC.GE.162 .AND. IC.LE.169 ) )
  153.      $            SUBNAM( I:I ) = CHAR( IC+64 )
  154.    20       CONTINUE
  155.          END IF
  156. *
  157.       ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN
  158. *
  159. *        Prime machines:  ASCII+128
  160. *
  161.          IF( IC.GE.225 .AND. IC.LE.250 ) THEN
  162.             SUBNAM( 1:1 ) = CHAR( IC-32 )
  163.             DO 30 I = 2, 6
  164.                IC = ICHAR( SUBNAM( I:I ) )
  165.                IF( IC.GE.225 .AND. IC.LE.250 )
  166.      $            SUBNAM( I:I ) = CHAR( IC-32 )
  167.    30       CONTINUE
  168.          END IF
  169.       END IF
  170. *
  171.       C1 = SUBNAM( 1:1 )
  172.       SNAME = C1.EQ.'S' .OR. C1.EQ.'D'
  173.       CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'
  174.       IF( .NOT.( CNAME .OR. SNAME ) )
  175.      $   RETURN
  176.       C2 = SUBNAM( 2:3 )
  177.       C3 = SUBNAM( 4:6 )
  178.       C4 = C3( 2:3 )
  179. *
  180.       GO TO ( 110, 200, 300 ) ISPEC
  181. *
  182.   110 CONTINUE
  183. *
  184. *     ISPEC = 1:  block size
  185. *
  186. *     In these examples, separate code is provided for setting NB for
  187. *     real and complex.  We assume that NB will take the same value in
  188. *     single or double precision.
  189. *
  190.       NB = 1
  191. *
  192.       IF( C2.EQ.'GE' ) THEN
  193.          IF( C3.EQ.'TRF' ) THEN
  194.             IF( SNAME ) THEN
  195.                NB = 64
  196.             ELSE
  197.                NB = 64
  198.             END IF
  199.          ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
  200.      $            C3.EQ.'QLF' ) THEN
  201.             IF( SNAME ) THEN
  202.                NB = 32
  203.             ELSE
  204.                NB = 32
  205.             END IF
  206.          ELSE IF( C3.EQ.'HRD' ) THEN
  207.             IF( SNAME ) THEN
  208.                NB = 32
  209.             ELSE
  210.                NB = 32
  211.             END IF
  212.          ELSE IF( C3.EQ.'BRD' ) THEN
  213.             IF( SNAME ) THEN
  214.                NB = 32
  215.             ELSE
  216.                NB = 32
  217.             END IF
  218.          ELSE IF( C3.EQ.'TRI' ) THEN
  219.             IF( SNAME ) THEN
  220.                NB = 64
  221.             ELSE
  222.                NB = 64
  223.             END IF
  224.          END IF
  225.       ELSE IF( C2.EQ.'PO' ) THEN
  226.          IF( C3.EQ.'TRF' ) THEN
  227.             IF( SNAME ) THEN
  228.                NB = 64
  229.             ELSE
  230.                NB = 64
  231.             END IF
  232.          END IF
  233.       ELSE IF( C2.EQ.'SY' ) THEN
  234.          IF( C3.EQ.'TRF' ) THEN
  235.             IF( SNAME ) THEN
  236.                NB = 64
  237.             ELSE
  238.                NB = 64
  239.             END IF
  240.          ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
  241.             NB = 1
  242.          ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN
  243.             NB = 64
  244.          END IF
  245.       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
  246.          IF( C3.EQ.'TRF' ) THEN
  247.             NB = 64
  248.          ELSE IF( C3.EQ.'TRD' ) THEN
  249.             NB = 1
  250.          ELSE IF( C3.EQ.'GST' ) THEN
  251.             NB = 64
  252.          END IF
  253.       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
  254.          IF( C3( 1:1 ).EQ.'G' ) THEN
  255.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  256.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  257.      $          C4.EQ.'BR' ) THEN
  258.                NB = 32
  259.             END IF
  260.          ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
  261.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  262.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  263.      $          C4.EQ.'BR' ) THEN
  264.                NB = 32
  265.             END IF
  266.          END IF
  267.       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
  268.          IF( C3( 1:1 ).EQ.'G' ) THEN
  269.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  270.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  271.      $          C4.EQ.'BR' ) THEN
  272.                NB = 32
  273.             END IF
  274.          ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
  275.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  276.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  277.      $          C4.EQ.'BR' ) THEN
  278.                NB = 32
  279.             END IF
  280.          END IF
  281.       ELSE IF( C2.EQ.'GB' ) THEN
  282.          IF( C3.EQ.'TRF' ) THEN
  283.             IF( SNAME ) THEN
  284.                IF( N4.LE.64 ) THEN
  285.                   NB = 1
  286.                ELSE
  287.                   NB = 32
  288.                END IF
  289.             ELSE
  290.                IF( N4.LE.64 ) THEN
  291.                   NB = 1
  292.                ELSE
  293.                   NB = 32
  294.                END IF
  295.             END IF
  296.          END IF
  297.       ELSE IF( C2.EQ.'PB' ) THEN
  298.          IF( C3.EQ.'TRF' ) THEN
  299.             IF( SNAME ) THEN
  300.                IF( N2.LE.64 ) THEN
  301.                   NB = 1
  302.                ELSE
  303.                   NB = 32
  304.                END IF
  305.             ELSE
  306.                IF( N2.LE.64 ) THEN
  307.                   NB = 1
  308.                ELSE
  309.                   NB = 32
  310.                END IF
  311.             END IF
  312.          END IF
  313.       ELSE IF( C2.EQ.'TR' ) THEN
  314.          IF( C3.EQ.'TRI' ) THEN
  315.             IF( SNAME ) THEN
  316.                NB = 64
  317.             ELSE
  318.                NB = 64
  319.             END IF
  320.          END IF
  321.       ELSE IF( C2.EQ.'LA' ) THEN
  322.          IF( C3.EQ.'UUM' ) THEN
  323.             IF( SNAME ) THEN
  324.                NB = 64
  325.             ELSE
  326.                NB = 64
  327.             END IF
  328.          END IF
  329.       ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN
  330.          IF( C3.EQ.'EBZ' ) THEN
  331.             NB = 1
  332.          END IF
  333.       END IF
  334.       ILAENV = NB
  335.       RETURN
  336. *
  337.   200 CONTINUE
  338. *
  339. *     ISPEC = 2:  minimum block size
  340. *
  341.       NBMIN = 2
  342.       IF( C2.EQ.'GE' ) THEN
  343.          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
  344.      $       C3.EQ.'QLF' ) THEN
  345.             IF( SNAME ) THEN
  346.                NBMIN = 2
  347.             ELSE
  348.                NBMIN = 2
  349.             END IF
  350.          ELSE IF( C3.EQ.'HRD' ) THEN
  351.             IF( SNAME ) THEN
  352.                NBMIN = 2
  353.             ELSE
  354.                NBMIN = 2
  355.             END IF
  356.          ELSE IF( C3.EQ.'BRD' ) THEN
  357.             IF( SNAME ) THEN
  358.                NBMIN = 2
  359.             ELSE
  360.                NBMIN = 2
  361.             END IF
  362.          ELSE IF( C3.EQ.'TRI' ) THEN
  363.             IF( SNAME ) THEN
  364.                NBMIN = 2
  365.             ELSE
  366.                NBMIN = 2
  367.             END IF
  368.          END IF
  369.       ELSE IF( C2.EQ.'SY' ) THEN
  370.          IF( C3.EQ.'TRF' ) THEN
  371.             IF( SNAME ) THEN
  372.                NBMIN = 8
  373.             ELSE
  374.                NBMIN = 8
  375.             END IF
  376.          ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN
  377.             NBMIN = 2
  378.          END IF
  379.       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
  380.          IF( C3.EQ.'TRD' ) THEN
  381.             NBMIN = 2
  382.          END IF
  383.       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
  384.          IF( C3( 1:1 ).EQ.'G' ) THEN
  385.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  386.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  387.      $          C4.EQ.'BR' ) THEN
  388.                NBMIN = 2
  389.             END IF
  390.          ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
  391.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  392.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  393.      $          C4.EQ.'BR' ) THEN
  394.                NBMIN = 2
  395.             END IF
  396.          END IF
  397.       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
  398.          IF( C3( 1:1 ).EQ.'G' ) THEN
  399.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  400.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  401.      $          C4.EQ.'BR' ) THEN
  402.                NBMIN = 2
  403.             END IF
  404.          ELSE IF( C3( 1:1 ).EQ.'M' ) THEN
  405.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  406.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  407.      $          C4.EQ.'BR' ) THEN
  408.                NBMIN = 2
  409.             END IF
  410.          END IF
  411.       END IF
  412.       ILAENV = NBMIN
  413.       RETURN
  414. *
  415.   300 CONTINUE
  416. *
  417. *     ISPEC = 3:  crossover point
  418. *
  419.       NX = 0
  420.       IF( C2.EQ.'GE' ) THEN
  421.          IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.
  422.      $       C3.EQ.'QLF' ) THEN
  423.             IF( SNAME ) THEN
  424.                NX = 128
  425.             ELSE
  426.                NX = 128
  427.             END IF
  428.          ELSE IF( C3.EQ.'HRD' ) THEN
  429.             IF( SNAME ) THEN
  430.                NX = 128
  431.             ELSE
  432.                NX = 128
  433.             END IF
  434.          ELSE IF( C3.EQ.'BRD' ) THEN
  435.             IF( SNAME ) THEN
  436.                NX = 128
  437.             ELSE
  438.                NX = 128
  439.             END IF
  440.          END IF
  441.       ELSE IF( C2.EQ.'SY' ) THEN
  442.          IF( SNAME .AND. C3.EQ.'TRD' ) THEN
  443.             NX = 1
  444.          END IF
  445.       ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN
  446.          IF( C3.EQ.'TRD' ) THEN
  447.             NX = 1
  448.          END IF
  449.       ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN
  450.          IF( C3( 1:1 ).EQ.'G' ) THEN
  451.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  452.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  453.      $          C4.EQ.'BR' ) THEN
  454.                NX = 128
  455.             END IF
  456.          END IF
  457.       ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN
  458.          IF( C3( 1:1 ).EQ.'G' ) THEN
  459.             IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.
  460.      $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.
  461.      $          C4.EQ.'BR' ) THEN
  462.                NX = 128
  463.             END IF
  464.          END IF
  465.       END IF
  466.       ILAENV = NX
  467.       RETURN
  468. *
  469.   400 CONTINUE
  470. *
  471. *     ISPEC = 4:  number of shifts (used by xHSEQR)
  472. *
  473.       ILAENV = 6
  474.       RETURN
  475. *
  476.   500 CONTINUE
  477. *
  478. *     ISPEC = 5:  minimum column dimension (not used)
  479. *
  480.       ILAENV = 2
  481.       RETURN
  482. *
  483.   600 CONTINUE 
  484. *
  485. *     ISPEC = 6:  crossover point for SVD (used by xGELSS and xGESVD)
  486. *
  487.       ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 )
  488.       RETURN
  489. *
  490.   700 CONTINUE
  491. *
  492. *     ISPEC = 7:  number of processors (not used)
  493. *
  494.       ILAENV = 1
  495.       RETURN
  496. *
  497.   800 CONTINUE
  498. *
  499. *     ISPEC = 8:  crossover point for multishift (used by xHSEQR)
  500. *
  501.       ILAENV = 50
  502.       RETURN
  503. *
  504. *     End of ILAENV
  505. *
  506.       END
  507.